#ifndef RPCPROVIDER_H
#define RPCPROVIDER_H

#include "google/protobuf/service.h"
/* rpcprovider提供了三个功能点
    1.集成了muduo库的网络功能: 提供了RPC请求收发和响应
    2.onmessage：接收到rpc请求后，如何去解析数据调用我们的业务方法
    3.提供了NotifyService(google::protobuf::service *)来向rpc provider上注册想要发布的RPC服务
 */

/* TcpServer:
这是 muduo 提供的一个高层抽象，用于创建TCP服务器。
它封装了监听套接字的创建、连接接受、以及消息读取等操作。
允许用户通过设置回调函数来处理新连接、消息到达等事件。 */
#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
#include <muduo/net/InetAddress.h> // 包含此行以使用 InetAddress 类
#include <muduo/net/TcpConnection.h>

#include <unordered_map>  // 映射表
#include <google/protobuf/descriptor.h>

/* 框架提供的专门服务: 发布rpc服务的网络对象类 */
class RpcProvider
{
public:
    //  NotifyService()是框架提供给外部使用的， 可以用来发布rpc方法的函数接口
    void NotifyService(google::protobuf::Service *service);
    // 启动rpc服务节点， 开始提供rpc远程网络调用 服务
    void run();

private:
    // // 组合了TcpServer 改变为 run()成员函数的局部变量,尽量不扩展变量的访问范围
    // std::unique_ptr<muduo::net::TcpServer> m_tcpserverPtr;
    // 组合了EventLoop
    muduo::net::EventLoop m_eventLoop;

    // service服务类型信息
    struct ServiceInfo
    {
        google::protobuf::Service * m_service;  // 保存服务对象
        std::unordered_map<std::string, const google::protobuf::MethodDescriptor*> m_methodMap; // 保存服务方法
    };
    // 存储注册成功的服务对象和 该服务对象的服务方法的所有信息
    // 一个string服务对象， 有一个服务信息(包含具体的服务对象的N个服务方法)
    std::unordered_map<std::string, ServiceInfo> m_serviceMap; 
    
    // 连接回调
    void onConnection(const muduo::net::TcpConnectionPtr &conn);

    // 消息读写回调方法
    void onMessage(const muduo::net::TcpConnectionPtr &conn, muduo::net::Buffer *buf, muduo::Timestamp time);

    // google::protobuf::closure* 回调操作, 用于序列化rpc的响应和网络发送
    void SendRpcResponse(const muduo::net::TcpConnectionPtr &conn, google::protobuf::Message *response);
};

#endif